#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/shm.h>
#include "sharemem.h"

#include "msg_def.h"

int sharememory(int ipc_size,int flag)
{
	int id;
	key_t key=ftok("/tmp",44);
	if(key < 0)
	{
		printf("get key error\n");
		return -1;
	}
	id = shmget(key,ipc_size,flag);
	if(id < 0)
	{
		printf("get id error\n");
		return -1;
	}
	return id;
}
 
int create_ipc(int ipc_size)
{
	return sharememory(ipc_size,IPC_CREAT|IPC_EXCL|0666);
}
int get_ipc(int ipc_size)
{
	return sharememory(ipc_size,IPC_CREAT|0666);
}
int destroy_sharememory(int id)
{
	return shmctl(id,IPC_RMID,NULL);

}


int putToShareMem(void *data)
{
    int id = get_ipc(sizeof(dp8_lld));

    if( id < 0)
    {
        id=create_ipc(sizeof(dp8_lld));
        if(id < 0)
        {
            printf("create sharememory error\n");
            return 0;
        }

        id = get_ipc(sizeof(dp8_lld));
    }

	int i=0;
	
	//id = 0;   

    dp8_lld *p = (dp8_lld *)shmat(id,NULL,0);

    if(p<0)
    {
        printf("shmat error\n");
        return 1;
    }

    dp8_lld *dataIn = (dp8_lld *)data;

    p->acc = dataIn->acc;
    p->dec = dataIn->dec;
    p->speed = dataIn->speed;
    p->maxPosition = dataIn->maxPosition;
    p->threshold = dataIn->threshold;

    if(shmdt(p) == -1)
    {
        printf("shmdt error\n");
    }

    return 0;
}


void getFromShareMem(void * data,int needRemove)
{
    int idRead = get_ipc(sizeof(dp8_lld));


    if(idRead<0)
    {
        printf("get_ipc error\n");
        return;
    }

    dp8_lld * ptrGet  = (dp8_lld *)shmat(idRead,NULL,0);


    if(ptrGet<0)
    {
        printf("get sharememory addr error\n");
        return;
    }

    if(ptrGet==NULL)
    {
        printf("mem ptr is NULL\n");
    }
    else
    {
        dp8_lld * dataOut = (dp8_lld *)data;
        memcpy(dataOut,ptrGet,sizeof(dp8_lld));
        // printf("threshold:%d\nacc:%d\ndec:%d\nspeed:%dpos:%d\n",
        // ptrGet->threshold,
        // ptrGet->acc,
        // ptrGet->dec,
        // ptrGet->speed,
        // ptrGet->maxPosition
        // );
    }  

    if(needRemove)
    {
       destroy_sharememory(idRead);
    }    
}



// int main(int argc, char * argv[])
// {
    
//     dp8_lld data;
//     data.acc = 2000;
//     data.dec = 3000;
//     data.speed = 4000;
//     data.maxPosition = 2500;
//     data.threshold = 3000;

//     putToShareMem(&data);

//     dp8_lld dataGet;
//     getFromShareMem(&dataGet,0);
//     printf("threshold:%d\nacc:%d\ndec:%d\nspeed:%d\npos:%d\n",
//     dataGet.threshold,
//     dataGet.acc,
//     dataGet.dec,
//     dataGet.speed,
//     dataGet.maxPosition
//     );

//     data.threshold = 60000;
//     putToShareMem(&data);
    
//     memset(&dataGet,0,sizeof(dp8_lld));
//     getFromShareMem(&dataGet,1);
//     printf("threshold:%d\nacc:%d\ndec:%d\nspeed:%d\npos:%d\n",
//     dataGet.threshold,
//     dataGet.acc,
//     dataGet.dec,
//     dataGet.speed,
//     dataGet.maxPosition
//     );

//     return 0;
// }